package com.xxxtea.common;

import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.annotation.JsonValue;

/**
 * 通用枚举接口（支持MyBatis-Plus与Jackson）
 * 
 * 统一定义枚举的value和label属性，便于数据库映射和前后端交互。
 * 提供根据value/label查找枚举对象的静态方法。
 * 支持MyBatis-Plus的IEnum接口和Jackson的@JsonValue注解。
 * 
 * @param <E> 枚举类型
 * @author badman
 * @since 1.0.0
 */
@SuppressWarnings("all")
public interface BaseEnum<E extends Enum<?>> extends IEnum<Integer> {

	/**
	 * 获取指定枚举类的所有枚举常量
	 * @param clazz 枚举类
	 * @return 枚举常量数组
	 */
	static BaseEnum<?>[] values(Class<?> clazz) {
		Class<? extends BaseEnum<?>> enumClass = (Class<? extends BaseEnum<?>>) clazz;
		return enumClass.getEnumConstants();
	}

	/**
	 * 根据value获取枚举对象
	 * @param clazz 枚举类
	 * @param value 枚举值
	 * @return 枚举对象
	 */
	static <E extends Enum<?>> BaseEnum<E> valueOf(Class<?> clazz, Integer value) {
		try {
			Class<? extends BaseEnum<?>> enumClass = (Class<? extends BaseEnum<?>>) clazz;
			for (BaseEnum<?> baseEnum : enumClass.getEnumConstants()) {
				if (baseEnum.getValue().equals(value)) {
					return (BaseEnum<E>) baseEnum;
				}
			}
		} catch (Exception e) {
			throw new IllegalArgumentException("无法将value转换为对应的BaseEnum类型");
		}
		return null;
	}

	/**
	 * 根据label获取枚举对象
	 * @param clazz 枚举类
	 * @param label 枚举标签
	 * @return 枚举对象
	 */
	static <E extends Enum<?>> BaseEnum<E> labelOf(Class<?> clazz, String label) {
		try {
			Class<? extends BaseEnum<?>> enumClass = (Class<? extends BaseEnum<?>>) clazz;
			for (BaseEnum<?> baseEnum : enumClass.getEnumConstants()) {
				if (baseEnum.getLabel().equals(label)) {
					return (BaseEnum<E>) baseEnum;
				}
			}
		} catch (Exception e) {
			throw new IllegalArgumentException("无法将label转换为对应的BaseEnum类型");
		}
		return null;
	}

	/**
	 * 获取枚举标签
	 * @return 标签
	 */
	String getLabel();

	/**
	 * 获取枚举值（数据库存储值）
	 * @return 枚举值
	 */
	@JsonValue
	Integer getValue();
}
